package com.反射Reflection.Class类;

public class Class__ {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        /// 1.Class类也是类，同样继承Object类；
        /// 2.Class类不是new出来的，而是系统创建的  通过loadClass来创建一个Class对象，同一种类只会创建一个Class类对象
        String cat = "com.反射Reflection.Class类.Cat";
        Class<?> cls1 = Class.forName(cat);
        /**
         * public Class<?> loadClass(String name) throws ClassNotFoundException {  name=com.反射Reflection.Class类.Cat
         *         return loadClass(name, false);
         *     }
         */

        /// 3.对于某个相同类的的Class类对象,内存中只有一份，因为类只会加载一次；
        /// cls1的哈希值  666641942
        /// cls2的哈希值  666641942  一种类的Class类对象只有一个
        Class<?> cls2 = Class.forName(cat);
        System.out.println(cls1.hashCode());
        System.out.println(cls2.hashCode());

        /// 4.每个类的实例都会记得自己是那个Class对象创建的；
        /// 虽然 cls1 和 cls2 是两个变量，但由于它们指向同一个 Class 对象（因为类只会被加载一次），所以用它们创建的实例本质上属于同一个类。
        Object o1 = cls1.newInstance(); ///Class类对象的实例；
        Object o2 = cls2.newInstance();
        System.out.println(o1.getClass()==o2.getClass());  ///true

        /// 5.通过Class类对象可以得到完整的一个类的结构，通过一系列API
        /// 6.Class类对象是存放在堆空间的
        /// 7.类的二进制字节码数据(也叫元数据) 是存放在方法区的 也叫元数据

    }
}
